﻿/*
 *  ============================================================================
 *  Name:           Gestão de parques de estacionamento
 *  Author:         João Faria
 *  Email:          a8836@alunos.ipca.pt
 *                  jfaria.gmr@gmail.com
 *  Version:        0
 *  Date:           2013-04-10
 *  Copyright:       
 *  Description:    IPCA - Programação II
 *                  Projecto final
 *  ============================================================================
 */
using System;
using System.Collections.Generic;
using GesParking.BusinessObjects;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace GesParking.DataLayer
{
    /// <summary>
    /// Classe que guarda os utilizadores
    /// </summary>
    [Serializable]
    public class UsersDL
    {
        #region Estado

        static bool alterado;
        static List<UserBO> listUsers;

        #endregion

        #region Construtor

        /// <summary>
        /// Construtor por omissão
        /// </summary>
        public UsersDL()
        {
            alterado = true;
            listUsers = new List<UserBO>();
        }

        #endregion

        #region Propriedades

        /// <summary>
        /// Propriedade alterado
        /// </summary>
        public static bool Alterado
        {
            get { return alterado; }
            set { alterado = value; }
        }

        #endregion

        #region Metodos
        
        /// <summary>
        /// Adciona novo utilizador
        /// </summary>
        /// <param name="u">Utilizador</param>
        /// 
        public static void AddDL(UserBO u)
        {
            listUsers.Add(u);
        }

        /// <summary>
        /// Desactiva um utilizador
        /// </summary>
        /// <param name="u">Utilizador</param>
        public static void DisableDL(UserBO u)
        {
            listUsers.Find(delegate(UserBO us) { return us.Id == u.Id; }).Activo = false;
        }

        /// <summary>
        /// Actualiza o nome do utilizador
        /// </summary>
        /// <param name="id">Id do user</param>
        /// <param name="n">Nome do user</param>
        public static void UpdateUserNameDL(Guid id, string n)
        {
            listUsers.Find(delegate(UserBO us) { return us.Id == id; }).Name = n;
        }

        /// <summary>
        /// Lista todos os utilizadores
        /// </summary>
        /// <returns>Lista de utilizadores</returns>
        public static List<UserBO> ListDL()
        {
            return listUsers;
        }

        /// <summary>
        /// Grava os dados dos users
        /// </summary>
        public static void Save()
        {
            /* 
             * Falta tratar erros com acessos e permissões de ficheiros
             */
            FileStream fsUsersDL = new FileStream(@"Data\Users.dat", FileMode.Create);
            BinaryFormatter bfwUsersDL = new BinaryFormatter();
            bfwUsersDL.Serialize(fsUsersDL, listUsers);
            fsUsersDL.Close();
        }

        /// <summary>
        /// Classe que lê os dados dos users
        /// </summary>
        public static void Read()
        {
            /* 
             * Falta tratar erros com acessos e permissões de ficheiros
             */
            FileStream fsUsersDL = new FileStream(@"Data\Users.dat", FileMode.Open);
            BinaryFormatter bfwUsersDL = new BinaryFormatter();
            listUsers = (List<UserBO>)bfwUsersDL.Deserialize(fsUsersDL);
        }

        #endregion

    }
}
